#include "stm32f10x.h"                  // Device header

void Encoder_Init(void)
{
	//1.RCC开启时钟（GPIO,TIM时钟）
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	//2.配置GPIO,将PA6,7配置成输入模式
	GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//3.配置时基单元，分配器选不分频
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数（计数有向上、向下、中央对齐计数）
	/*定时时间决定于以下俩个对象*/
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;//如果信号频率太低，CNT计数值可能会溢出
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;//预分频不分频，编码器的时钟，直接驱动计数器  
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值，高级定时器才有，TIM2为通用定时器，故置零
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
	//4.配置输入捕获单元：包括滤波器、极性;
	TIM_ICInitTypeDef TIM_ICInitStructure;
	
	TIM_ICStructInit(&TIM_ICInitStructure);//结构体初始化(结构体并没有配置完整)
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//选择输入捕获通道
	TIM_ICInitStructure.TIM_ICFilter = 0xF;//配置输入捕获的滤波器（如果信号有噪声，可以增大滤波器参数，可以有效避免干扰）
	
	TIM_ICStructInit(&TIM_ICInitStructure);//结构体初始化(结构体并没有配置完整)
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//选择输入捕获通道
	TIM_ICInitStructure.TIM_ICFilter = 0xF;//配置输入捕获的滤波器（如果信号有噪声，可以增大滤波器参数，可以有效避免干扰）
	TIM_ICInit(TIM3,&TIM_ICInitStructure);
	//5.配置编码器接口模式
	TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);//俩个通道均不反向
	
	//6.调用TIM_Cmd函数，开启定时器
	TIM_Cmd(TIM3,ENABLE);
}

int16_t Encoder_Get(void)
{
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3,0);
	return Temp;
}
